package cn.mujiankeji.mbrowser.数据.配置项

import android.annotation.SuppressLint
import android.content.res.Configuration
import cn.mujiankeji.mbrowser.工具.配置助手
import cn.mujiankeji.mbrowser.数据.枚举类.下载器枚举
import cn.mujiankeji.mbrowser.数据.枚举类.主题颜色枚举
import cn.mujiankeji.mbrowser.数据.枚举类.功能枚举
import cn.mujiankeji.mbrowser.数据.枚举类.翻页动画枚举
import cn.mujiankeji.mbrowser.数据.枚举类.翻页手势识别枚举
import com.blankj.utilcode.util.FileUtils
import com.blankj.utilcode.util.PathUtils
import com.blankj.utilcode.util.Utils
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.first
import kotlinx.coroutines.flow.map
import kotlinx.coroutines.runBlocking

/**
 * 应用配置类，用于管理底部工具栏配置
 */
@SuppressLint("StaticFieldLeak")
object 应用配置 : 配置助手(Utils.getApp().baseContext, "mbrowser_settings") {

    // -- 基本文件夹
    var 路径_数据 : String = ""
    var 路径_用户脚本 : String = ""
    var 路径_广告过滤规则 : String = ""
    var 路径_下载 : String = ""
    var 路径_缓存 : String = ""
    var 路径_离线页面 : String = ""
    init {
        val ctx = Utils.getApp().baseContext
        路径_数据 = ctx.filesDir.toString() + "/"
        路径_离线页面 = 路径_数据 + "pages/"
        FileUtils.createOrExistsDir(路径_离线页面)

        路径_广告过滤规则 = 路径_数据 + "adblock/"
        FileUtils.createOrExistsDir(路径_广告过滤规则)

        路径_用户脚本 = 路径_数据 + "webscript/"
        FileUtils.createOrExistsDir(路径_用户脚本)

        路径_缓存 = ctx.cacheDir.absolutePath + "/"

        路径_下载 = PathUtils.getExternalDownloadsPath() + "/mbrowser/"
    }

    val 阅读器 by lazy { 阅读器配置(this) }



    // 视图-工具栏 0 - 5
    fun 底部工具栏功能(pos : Int) : Flow<功能枚举>{
        val defs = listOf(功能枚举.窗口,功能枚举.后退,功能枚举.标题标签,功能枚举.首页,功能枚举.菜单)
        return 读取("bottom_toolbar_${pos}",defs[pos].name)
            .map { 功能枚举.valueOf(it) }
    }
    suspend fun 设置底部工具栏功能(pos : Int,f : 功能枚举){
        设置("bottom_toolbar_${pos}", f.name)
    }


    // -- 主题 --
    fun 读取主题颜色() : Flow<主题颜色枚举>{
        return 读取("主题颜色",主题颜色枚举.跟随系统.name)
            .map { 主题颜色枚举.valueOf(it) }
    }
    suspend fun 设置主题颜色(t : 主题颜色枚举) = 设置("主题颜色",t.name)

    fun 读取当前主题颜色() : Flow<Boolean>{
        return 读取("主题颜色",主题颜色枚举.跟随系统.name)
            .map {
                if (it == 主题颜色枚举.跟随系统.name) {
                    val currentNightMode = Utils.getApp().resources.configuration.uiMode and Configuration.UI_MODE_NIGHT_MASK
                    currentNightMode == Configuration.UI_MODE_NIGHT_YES
                }else if (it == 主题颜色枚举.深色.name){
                    true
                }
                else{
                    false
                }
            }
    }


    fun 读取启动时打开上次未关闭页面() : Flow<Boolean> = 读取("启动时打开上次未关闭页面",false)
    suspend fun 设置启动时打开上次未关闭页面(b : Boolean) = 设置("启动时打开上次未关闭页面",b)

    fun 读取界面框架色跟随页面变化() : Flow<Boolean> = 读取("界面框架色跟随页面",true)
    suspend fun 设置界面框架的跟随页面变化(b : Boolean) = 设置("界面框架色跟随页面",b)

    fun 读取手势翻页动画() : Flow<翻页动画枚举> = 读取("手势翻页动画",翻页动画枚举.翻页.name).map { 翻页动画枚举.valueOf(it) }
    suspend fun 设置手势翻页动画(a : 翻页动画枚举) = 设置("手势翻页动画",a.name)

    fun 读取滑屏翻页识别方式() : Flow<翻页手势识别枚举> = 读取("滑屏翻页识别方式",翻页手势识别枚举.智能识别.name)
        .map { 翻页手势识别枚举.valueOf(it) }
    suspend fun 设置滑屏翻页识别方式(a : 翻页手势识别枚举) = 设置("滑屏翻页识别方式",a.name)


    // -- 主页 --
    fun 读取主页上滑响应功能() : Flow<功能枚举> = 读取("主页上滑响应功能",功能枚举.无.name)
        .map { 功能枚举.valueOf(it) }
    suspend fun 设置主页上滑响应功能(f : 功能枚举) = 设置("主页上滑响应功能",f.name)
    fun 读取主页下滑响应功能() : Flow<功能枚举> = 读取("主页下滑响应功能",功能枚举.搜索.name)
        .map { 功能枚举.valueOf(it) }
    suspend fun 设置主页下滑响应功能(f : 功能枚举) = 设置("主页下滑响应功能",f.name)

    // -- 网页 --
    fun 读取网页内容合规检测() : Flow<Boolean> = 读取("网页异常警示",true)
    suspend fun 设置网页内容合规检测(b : Boolean) = 设置("网页异常警示",b)

    fun 读取浏览框字体缩放比例() : Flow<Int> = 读取("浏览框字体缩放比例",100) // 0 - 200
    suspend fun 设置浏览框字体缩放比例(比例 : Int = 100) = 设置("浏览框字体缩放比例",比例)

    fun 读取浏览框下拉刷新() : Flow<Boolean> = 读取("浏览框下拉刷新",false)
    suspend fun 设置浏览框下拉刷新(b : Boolean) = 设置("浏览框下拉刷新",b)

    fun 读取浏览框无图模式() : Flow<Boolean> = 读取("无图模式",false)
    suspend fun 设置浏览框模式(b : Boolean) = 设置("无图模式",b)

    fun 读取无痕模式() : Flow<Boolean> = 读取("无痕模式",false)
    suspend fun 设置无痕模式(b : Boolean) = 设置("无痕模式",b)

    fun 读取浏览框强制SSL检测() : Flow<Boolean> = 读取("浏览框强制SSL检测",false)
    suspend fun 设置浏览框强制SSL检测(b : Boolean) = 设置("浏览框强制SSL检测",b)

    fun 读取浏览框支持第三方COOKIE() : Flow<Boolean> = 读取("浏览框支持第三方COOKIE",true)
    suspend fun 设置浏览框支持第三方COOKIE(b : Boolean) = 设置("浏览框支持第三方COOKIE",b)

    fun 读取启用浏览框脚本() : Flow<Boolean> = 读取("启用浏览框脚本",true)
    suspend fun 设置启用浏览框脚本(b : Boolean) = 设置("启用浏览框脚本",b)
    fun 读取启用用户脚本() : Flow<Boolean> = 读取("启用用户脚本",true)
    suspend fun 设置启用用户脚本(b : Boolean) = 设置("启用用户脚本",b)

    // -- 用户所设定的标识 --
    fun 读取默认UA标识() : Flow<String> = 读取("默认标识","")
    suspend fun 设置默认UA标识(ua : String){
        设置("默认标识",ua)
    }

    // -- 所设定的电脑版标识 --
    fun 读取电脑版UA标识() : Flow<String>{
        return 读取("电脑版标识",电脑模式标识())
    }
    suspend fun 设置电脑版UA标识(ua : String){
        设置("电脑版标识",ua)
    }
    fun 电脑模式标识() : String = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36"

    fun 读取强制启动电脑模式() : Flow<Boolean> = 读取("强制启动电脑模式",false)
    suspend fun 设置强制启动电脑模式(b : Boolean) = 设置("强制启动电脑模式",b)

    // -- 本机自身的标识 --
    fun 读取本机UA标识() : String{
        return runBlocking { 读取("本机标识","").first().ifEmpty { 电脑模式标识() } }
    }
    suspend fun 设置本机UA标识(ua : String){
        设置("本机标识",ua)
    }


    // -- 下载器 --
    fun 读取下载器() : Flow<下载器枚举>{
        return 读取("下载器",下载器枚举.应用内置.name)
            .map { 下载器枚举.valueOf(it) }
    }
    suspend fun 设置下载器(d : 下载器枚举){
        设置("下载器",d.name)
    }

    // -- 媒体 --
    fun 读取视频长按倍速() : Flow<Float> = 读取("视频长按倍速",3.0f)
    suspend fun 设置视频长按倍速(s : Float) = 设置("视频长按倍速",s)
    fun 读取视频后台播放() : Flow<Boolean> = 读取("视频后台播放",false)
    suspend fun 设置视频后台播放(b : Boolean) = 设置("视频后台播放",b)
    fun 读取视频默认倍速() : Flow<Float> = 读取("视频默认倍速",1.0f)
    suspend fun 设置视频默认倍速(f : Float) = 设置("视频默认倍速",f)

    // -- 搜索 --
    fun 读取输入补全书签历史() : Flow<Boolean> = 读取("输入补全书签历史",true)
    suspend fun 设置输入补全书签历史(b : Boolean) = 设置("输入补全书签历史",b)
    fun 读取输入补全网络关键词() : Flow<Boolean> = 读取("输入补全网络关键词",true)
    suspend fun 设置输入补全网络关键词(b : Boolean) = 设置("输入补全网络关键词",b)

    // -- 主页 --
    fun 读取主页样式() : Flow<String> = 读取("主页样式","")
    suspend fun 设置主页样式(s : String) = 设置("主页样式",s)

    fun 设置全屏模式(全屏 : Boolean){
        runBlocking { 设置("全屏模式",全屏) }
    }
    fun 是否全屏模式() : Flow<Boolean> = 读取("全屏模式",false)

    // 广告拦截启用与否
    var 广告拦截 : Boolean
        get() = runBlocking { 读取("广告拦截",false).first() }
        set(value)  = runBlocking { 设置("广告拦截",value) }


    // 跳转默认的搜索引擎
    fun 默认搜索地址(关键词 : String) : String{
        return "https://www.baidu.com/s?wd=${关键词}"
    }

}